home *** CD-ROM | disk | FTP | other *** search
- /*
- * histinfo - print history file lines for articles named on stdin
- */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h> /* for modified time (date received) */
- #include <string.h>
- #include "config.h"
- #include "fgetmfs.h"
- #include "alloc.h"
- #include "case.h"
-
- #define STRLEN(s) (sizeof(s) - 1) /* s must be a char array */
-
- char *progname;
- int debug;
-
- FILE *efopen();
-
- char *spdir;
- int spdirlen;
-
- /*
- * main - parse arguments and handle options
- */
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int c;
- int errflg = 0;
- FILE *in;
- char *inname;
- register int i;
- extern int optind;
- extern char *optarg;
-
- progname = argv[0];
- while ((c = getopt(argc, argv, "d")) != EOF)
- switch (c) {
- case 'd':
- ++debug;
- break;
- default:
- errflg++;
- break;
- }
- if (optind < argc || errflg) {
- (void) fprintf(stderr, "usage: %s [-d]\n", progname);
- exit(2);
- }
-
- spdir = artfile((char *)NULL);
- spdirlen = strlen(spdir);
-
- while ((inname = fgetms(stdin)) != NULL) {
- i = strlen(inname);
- if (i > 0)
- inname[i-1] = '\0'; /* kill newline */
- if (strchr(inname, '.') == NULL) { /* skip dot names */
- in = efopen(inname, "r");
- process(in, inname);
- (void) fclose(in);
- }
- free(inname);
- }
- exit(0);
- }
-
- /*
- * process - process input file
- */
- process(in, inname)
- FILE *in;
- char *inname;
- {
- char *name;
- char *line;
- char *msgid;
- char *expiry;
- time_t datercv;
- struct stat statb;
- static char msgidnm[] = "Message-ID:";
- static char expnm[] = "Expires:";
- register char *p;
- register int i;
-
- expiry = strsave("-");
- msgid = NULL;
-
- /* read until EOF or blank line (end of headers) */
- while ((line = fgetms(in)) != NULL && strcmp(line, "\n") != 0) {
- i = strlen(line);
- if (i > 0)
- line[i-1] = '\0'; /* trim newline */
- if (CISTREQN(line, msgidnm, STRLEN(msgidnm))) {
- if (msgid != NULL)
- free(msgid);
- p = line + STRLEN(msgidnm);
- msgid = strsave(p + strspn(p, " \t"));
- } else if (CISTREQN(line, expnm, STRLEN(expnm))) {
- free(expiry);
- p = line + STRLEN(expnm);
- expiry = strsave(p + strspn(p, " \t"));
- }
- free(line);
- }
- if (line != NULL)
- free(line);
-
- /* generate the file name */
- name = inname;
- if (strncmp(name, spdir, spdirlen) == 0 &&
- name[spdirlen] == '/')
- name += spdirlen + 1; /* skip spool dir. & slash */
-
- /* generate the date received */
- (void) fstat(fileno(in), &statb);
- datercv = statb.st_mtime;
-
- /* deal with empty and trash articles */
- if (msgid == NULL || strchr(msgid, '\t') != NULL || msgid[0] != '<' ||
- msgid[strlen(msgid)-1] != '>' ||
- strchr(expiry, '\t') != NULL ||
- strchr(expiry, '~') != NULL) {
- if (msgid != NULL)
- free(msgid);
- msgid = str3save("<", name, "@trash>");
- datercv = 0;
- free(expiry);
- expiry = strsave("0");
- }
-
- /* whomp out the history line */
- (void) fputs(msgid, stdout);
- printf("\t%ld~", (long)datercv);
- (void) fputs(expiry, stdout);
- (void) putchar('\t');
- (void) fputs(name, stdout);
- (void) putchar('\n');
- (void) fflush(stdout);
- free(msgid);
- free(expiry);
- }
-
- /*
- * unprivileged - no-op to keep pathname stuff happy
- */
- void
- unprivileged(reason)
- char *reason;
- {
- }
-